package com.zxn.kotlin;

/**
 * 10、 金额转换，阿拉伯数字转换成中国传统形式。
 * 例如：1010 0000 1010
 * 转换为   壹仟零壹拾亿零壹仟零壹拾圆整
 *
 * @author Administrator
 */
public class Test10 {

    /**
     * @param args
     */
    public static void main(String[] args) {

        String str = "101000001010";
        convertToChineseFormat(str);
    }

    /**
     * 将字符串转换为中文格式
     *
     * @param str
     */
    public static void convertToChineseFormat(String str) {
        if (!str.matches("\\d+")) {//正则判断是不是数字
            System.out.println("字符串" + str + "不是数字格式，无法转换！");
            return;//不是 则返回
        }
        while (str.startsWith("0")) { //将字符串最前面的0去掉
            str = str.substring(1, str.length());
        }
        char[] num = new char[]{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
        char[] cnNum = new char[]{'零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'};
        for (int i = 0; i < 10; i++) {//将字符串数字替换成中文数字，循环对应替换
            str = str.replace(num[i], cnNum[i]);
        }

        StringBuilder sb = new StringBuilder(str);//StringBuilder存放字符串，用于插入删除操作
        int index = str.length() - 1;   //从第index个字符从后往前开始操作，操作一次，index--
        //存放金额单位
        String[] unit = {"", "拾", "佰", "仟"};
        String[] unit4 = {"万", "亿"};

        boolean flag = false;//判断前一个数是否为零的标记

        for (int i = 0; i < str.length(); i++) {//循环体内对sb进行操作

            //每4位插入万每8位插入亿，最低位先不设置单位
            if (i % 4 == 0 && i != 0) {
                //根据金额规则，单位万前面为4个零时，不插入万，并将index位置（最低位）的零删除
                if ((i / 4 - 1) % 2 == 0 && index >= 3 && str.substring(index - 3, index + 1).equals("零零零零")) {
                    sb.deleteCharAt(index);
                    index--;
                    continue;
                }
                //否则在index+1位置插入相应的单位：万、亿
                sb.insert(index + 1, unit4[(i / 4 - 1) % 2]);
            }
            //如果4位的最低位为零，删除最低位的零，将零标志置为true
            if (i % 4 == 0 && str.charAt(index) == '零') {
                sb.deleteCharAt(index);
                flag = true;
                index--;
                continue;
            }
            //如果前一位为零并且这一位也为零，删除这一位的零
            if (flag && str.charAt(index) == '零') {
                sb.deleteCharAt(index);
                index--;
                continue;
            }
            //如果当前位为零，将零标志置为true
            if (str.charAt(index) == '零') {
                flag = true;
                index--;
                continue;
            }
            //当前位不为零，将零标志位置为false，插入金额单位
            flag = false;
            sb.insert(index + 1, unit[i % 4]);
            index--;
            //完善金额表示形式
            sb.append("圆整");
            System.out.println(sb.toString());
        }

    }
}

